﻿/***********************************************************************************\
| Copyright (c) 2011, Bashar Al-Rawi                                                |
| All rights reserved.                                                              |
|                                                                                   |
| Redistribution and use in source and binary forms, with or without                |
| modification, are permitted provided that the following conditions are met:       |
|    * Redistributions of source code must retain the above copyright               |
|      notice, this list of conditions and the following disclaimer.                |
|    * Redistributions in binary form must reproduce the above copyright            |
|      notice, this list of conditions and the following disclaimer in the          |
|      documentation and/or other materials provided with the distribution.         |
|    * Neither the name of the <organization> nor the                               |
|      names of its contributors may be used to endorse or promote products         |
|      derived from this software without specific prior written permission.        |
|                                                                                   |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND   |
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED     |
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE            |
| DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY                |
| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES        |
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;      |
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND       |
| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT        |
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS     |
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                      |
\***********************************************************************************/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Diagnostics;
using System.Threading;
using Microsoft.Phone.Tasks;
using System.Text;
using Arabic.Controls;
using Microsoft.Phone.Shell;


namespace Arabic.SMS
{
    public partial class MainPage : PhoneApplicationPage
    {
        private bool IsFirstSend
        {
            get
            {
                return ApplicationGlobals.ApplicationPersistedSettings.GetValue<bool>("IsFirstSend");
            }
        }
        private PhoneNumberChooserTask numberChooser;

        private void SetFirstSend()
        {
            ApplicationGlobals.ApplicationPersistedSettings.AddOrUpdateValue("IsFirstSend", true);
            ApplicationGlobals.ApplicationPersistedSettings.Save();
        }

        // Constructor
        public MainPage()
        {
            InitializeComponent();
            ApplicationGlobals.Instance.Orientation = this.Orientation;
            this.keyboard.FirstInitialize();
            //Application.Current.Host.Settings.EnableFrameRateCounter = true;
            //Application.Current.Host.Settings.EnableRedrawRegions = true;

        }

        private void Scroll(double value)
        {
            this.SlideKeyFrame.Value = value;
            this.ScrollTextStoryboard.Begin();
        }

        private void keyboard_KeyboardShow(object sender, EventArgs e)
        {
            this.Scroll(this.keyboard.Height);
            this.textBlock.FocusText();
            triangle.Fill = ApplicationGlobals.TextboxEditBrush;
        }

        private void keyboard_KeyboardHide(object sender, EventArgs e)
        {
            this.Scroll(0);
            this.textBlock.Defocus();
            triangle.Fill = ApplicationGlobals.TextboxBrush;
            
        }

        private void PhoneApplicationPage_OrientationChanged(object sender, OrientationChangedEventArgs e)
        {
            ApplicationGlobals.Instance.Orientation = e.Orientation;
            grid1.RowDefinitions[0].Height = new GridLength(ApplicationGlobals.Height);
           
            if (SIP.Instance.Visible)
            {
                this.keyboard.Hide();                
            }
            UpdateTextLayout();          
        }

        private void UpdateTextLayout()
        {
            this.textBlock.Update();
        }

        private void sendButton_Click(object sender, EventArgs e)
        {
            numberChooser.Show();
        }

        private void numberChooser_Completed(object sender, PhoneNumberResult e)
        {
            if (!IsFirstSend)
            {
                MessageBoxResult result = MessageBox.Show(
                        "ستظهر الحروف العربية هنا بالعكس. إهملها رجاء لأن الحروف ستظهر بصورة صحيحة في الرسالة النصية",
                        "أرسل الرسالة النصية",
                        MessageBoxButton.OK);
                SetFirstSend();
            }
            new SmsComposeTask() { Body = this.textBlock.RawText, To = e.PhoneNumber }.Show();
        }

        private void PhoneApplicationPage_BackKeyPress(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (SIP.Instance.Visible)
            {
                e.Cancel = true;
                this.keyboard.Dismiss();
            }
        }

        private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {
            this.keyboard.InitializeKeyboard();
            this.keyboard.KeyboardHide += new EventHandler(keyboard_KeyboardHide);
            this.keyboard.KeyboardShow += new EventHandler(keyboard_KeyboardShow);
            this.OrientationChanged += keyboard.Keyboard__OrientationChanged;
            numberChooser = new PhoneNumberChooserTask();
            numberChooser.Completed += new EventHandler<PhoneNumberResult>(numberChooser_Completed);
            this.textBlock.SetKeyboard(this.keyboard);
            this.textBlock.DeSerialize(this.Name + "_" + this.textBlock.Name + ".dat");
            UpdateTextLayout();
            PhoneApplicationService.Current.Deactivated += new EventHandler<DeactivatedEventArgs>(Current_Deactivated);
            triangle.DataContext = this.textBlock;
            triangle.Fill = ApplicationGlobals.TextboxBrush;            
        }

        void Current_Deactivated(object sender, DeactivatedEventArgs e)
        {
            this.textBlock.Serialize(this.Name + "_" + this.textBlock.Name + ".dat");
        }

        private void PhoneApplicationPage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (SIP.Instance.Visible && e.GetPosition(keyboard).Y < 0)
            {
                e.Handled = true;
                this.keyboard.Dismiss();
            }
           
        }
    }
}
